# _*_coding:utf-8 _*_
# @ Time　　 : 2022/12/13 17:05
# @ Author　 : 郭鑫垚
# @ class　  : 数据201
import os
import time
import openpyxl
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys


# excel表格写入启动
def writer_excel():
    # 实例化一个workbook对象
    workbook = openpyxl.Workbook()
    # 激活一个sheet
    sheet = workbook.active
    # 设置表名
    col_names = ['车辆信息', '上牌年月', '里程', '排放标准', '变速类型', '所在地',
                 '价格/万', '新车税前价/万', '新车税后价/万', '新车税款/万']
    sheet.append(col_names)
    return sheet, workbook


# excel表格写入结束,保存文件名,如果已存在则删除
def close_excel(wk):
    # 设置路径,上一级的数据目录
    file_path = '../数据/二手车数据.xlsx'
    if not os.path.exists(file_path):
        # 保存
        wk.save(file_path)
    else:
        # 已存在则删除，重新保存
        os.remove(file_path)
        wk.save(file_path)


# 浏览器启动首页数据
def brower_open():
    option = webdriver.ChromeOptions()
    # 指定用户数据，个人Googlechrome更改在D盘，自动扫不到
    option.add_argument(r'--user-data-dir=D:\软件\Google\User Data')
    # 不自动关闭浏览器
    # option.add_experimental_option("detach", True)
    browser = webdriver.Chrome(options=option)
    # browser.get('https://www.baidu.com')
    url = 'https://so.iautos.cn/quanguo/p1asdsv1epcatcpbnscac/#buyCars'
    browser.get(url)
    browser.maximize_window()  # 最大化浏览器
    return browser


# 获取新车价格同一span标签下3个信息
# 提取li标签下equation数据
def meter_get(li):
    try:
        # 发现有一个没有新车价格参考，而且没有span标签，如果直接提取span数据会定位出错，所以做了一个是否存在
        # 这3个数据在一个div标签下，如果定位出错则不存在，则存为空
        # 新车税前价
        price_before = ''.join(li.find_element(By.XPATH, './/span[@class="equation"]/i[1]').text)
        # 新车税后价格
        price_after = ''.join(li.find_element(By.XPATH, './/span[@class="equation"]/i[3]').text)
        # 新车税
        tax = ''.join(li.find_element(By.XPATH, './/span[@class="equation"]/i[2]').text)
    except Exception as e:
        price_before, price_after, tax = '', '', ''
        print("error----->价格数据异常", e)
        return price_before, price_after, tax
    else:
        print("--->价格正常")
        return price_before, price_after, tax


# 获取里程等同一div标签下五个信息
def info_get(li):
    try:
        # 上牌日期
        date = ''.join(li.find_element(By.XPATH, './/div[@class="parameter"]/span[1]').text)
        # 表显里程
        parameter = ''.join(li.find_element(By.XPATH, './/div[@class="parameter"]/span[2]').text)
        # 排放标准
        emission = ''.join(li.find_element(By.XPATH, './/div[@class="parameter"]/span[3]').text)
        # 变速类型 档位
        gear = ''.join(li.find_element(By.XPATH, './/div[@class="parameter"]/span[4]').text)
        # 所在地
        place = ''.join(li.find_element(By.XPATH, './/div[@class="parameter"]/span[5]').text)
    except Exception as e:
        date, parameter, emission, gear, place = '', '', '', '', ''
        print("error----->信息数据异常", e)
        return date, parameter, emission, gear, place
    else:
        print("--->信息正常")
        return date, parameter, emission, gear, place


# 翻页功能
def page_down(browser):
    try:
        # 点击下一页
        browser.find_element(By.XPATH, '//*[@id="nextPageBtn"]').click()
    except Exception as e:
        # 按下方向键 ->
        browser.find_element(By.XPATH, '//*[@id="pageBox"]/span[3]').send_keys(Keys.RIGHT)
        print('方向键翻页成功')
    else:
        print('点击翻页成功')


# selenium主程序；实现翻页，定位，及调用获取信息方法
def page(browser, sheet):
    try:
        browser.implicitly_wait(10)
        # 查找所有li标签
        lis = browser.find_elements(By.XPATH, './/li[@class="clear"]')
        # print(type(lis))
        for index, li in enumerate(lis):
            # 车辆名字基本信息：别克GL8 ES陆尊 2.0T 自动 653T豪华型
            name = ''.join(li.find_element(By.XPATH, './/div[@class="info"]/h6/a').text)
            # # 价格 万
            price = ''.join(li.find_element(By.XPATH, './/div[@class="going-price"]/strong').text)
            # 这五个数据在一个div标签下，如果定位不到则存为空
            date, meter, emission, gear, place = info_get(li)
            # 这3个数据在一个div标签下，如果定位不到则存为空
            price_before, price_after, tax = meter_get(li)
            # 包装
            data_list = [name, date, meter, emission, gear, place, price, price_before, price_after, tax]
            sheet.append(data_list)
            # print(data_list)
            # print(f'-->>>>第{index + 1}条数据添加成功')
    except Exception as e:
        print('异常', e)
    else:
        # 页面滑动到最下方
        browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
        time.sleep(1)
        # 翻页
        page_down(browser)
        time.sleep(3)


# main方法，设计翻页次数，及启动总体代码
if __name__ == '__main__':
    sheet1, wk1 = writer_excel()
    brower = brower_open()
    for i in range(50):
        page(brower, sheet1)
        print(f'----------》第{i + 1}页数据ok')
    close_excel(wk1)
    # time.sleep(10)
    brower.quit()
    print("-------!!!!all-ok!!!!--------")
